Jeste problem s thready

Otázka od: tomsir1.edu@mail.cez.cz

25. 8. 2004 9:32


Ahoj,

navazu na muj predchozi dotaz ... ted mam funkcni WaitForMultipleObjects ..
a vytvarim nejake thready. V nich potom oteviram TCP spojeni a udalosti
jako napr. chyby posilam v metode Synchronize do Mema na hlavnim formulari
...
Problem nastal v tom, ze kdyz za behu threadu uzavru aplikaci, vyskoci mi
Acces Violation s tim, ze dochazi k zapisu do nepovolene pameti. Prisel
jsem na to, ze pote co v OnCloseQuery hl. formu zavolam Terminate tech
threadu, dojde jeste k volani Synchronize

Jak mam zabezpecit, aby pred nastavenim CanClose = true byly opravdu
vsechny thready ukonceny ??

Diky Radek


Odpovedá: Ales Vasicek

25. 8. 2004 9:45

Ahoj,

zkus volat jeste Thread.WaitFor; napr:

MujThread.Terminate;
MujThread.WaitFor;
MujThread.Free;


Ales

> -----Original Message-----
> From: tomsir1.edu@mail.cez.cz [mailto:tomsir1.edu@mail.cez.cz]
> ...
> Problem nastal v tom, ze kdyz za behu threadu uzavru
> aplikaci, vyskoci mi
> Acces Violation s tim, ze dochazi k zapisu do nepovolene
> pameti. Prisel
> jsem na to, ze pote co v OnCloseQuery hl. formu zavolam Terminate tech
> threadu, dojde jeste k volani Synchronize
>
> Jak mam zabezpecit, aby pred nastavenim CanClose = true byly opravdu
> vsechny thready ukonceny ??


Odpovedá: Slavomir Skopalik

25. 8. 2004 10:01

Zrejme pouzivas free on terminate -> thread se sam zrusi pri ukonceni.
Mas dve moznosti:
1. zakazat volani synchronize po zavolani teminate
2. pouzit WaitFor (vypnout free on terminate) funkci, ktera pocka, nez
je thread ukoncen.

 Slavek

>
> navazu na muj predchozi dotaz ... ted mam funkcni
> WaitForMultipleObjects .. a vytvarim nejake thready. V nich
> potom oteviram TCP spojeni a udalosti jako napr. chyby
> posilam v metode Synchronize do Mema na hlavnim formulari ...
> Problem nastal v tom, ze kdyz za behu threadu uzavru
> aplikaci, vyskoci mi Acces Violation s tim, ze dochazi k
> zapisu do nepovolene pameti. Prisel jsem na to, ze pote co v
> OnCloseQuery hl. formu zavolam Terminate tech threadu, dojde
> jeste k volani Synchronize
>
> Jak mam zabezpecit, aby pred nastavenim CanClose = true byly
> opravdu vsechny thready ukonceny ??
>


Odpovedá: Petr Vones

25. 8. 2004 10:09

From: <tomsir1.edu@mail.cez.cz>
> Jak mam zabezpecit, aby pred nastavenim CanClose = true byly opravdu
> vsechny thready ukonceny ??

V zasade musis volat sekvenci:

Terminate
WaitFor

Pricemz jejich podoba uz zavisi na konkretni implementaci (napriklad Terminate
nastavi nejdeiv priznak Terminated a pak event na ktery se ceka v threadu,
nebo samostatny event ktery indikuje pozadavek ukonceni threadu apod.)

Petr Vones


Odpovedá: Vaclav Sazima

25. 8. 2004 11:02

 Ahoj,
ja to resim tak, ze si jeste vytvorim dalsi event a kdyz chci thread
ukoncit, tak ji (ho,to?) nastavim, tim dosahnu ukonceni
WaitForMultipleObjects a nasledni i normalniho ukonceni metody execute
thredu.
  Vaclav Sazima
tomsir1.edu@mail.cez.cz wrote:

>... ted mam funkcni WaitForMultipleObjects ..
> Problem nastal v tom, ze kdyz za behu threadu uzavru aplikaci, vyskoci mi
> Acces Violation s tim, ze dochazi k zapisu do nepovolene pameti. Prisel
> jsem na to, ze pote co v OnCloseQuery hl. formu zavolam Terminate tech
> threadu, dojde jeste k volani Synchronize
>
> Jak mam zabezpecit, aby pred nastavenim CanClose = true byly opravdu
> vsechny thready ukonceny ??
>
> Diky Radek